/*
* 枚举中间节点
* 存在三种情况
* 1.以当前节点的子树中的节点到自身的路径
*   直接找到最长节点
* 2.以当前节点的子树中的节点到另一子树的路径
    找到最长路径，次长路径，拼接处理
* 3.以当前节点的子树中的节点到非子树节点的路径

* 当是情况3时，转化为祖先节点的情况1，2处理
*/
#include <iostream>
#include <cstring>

using namespace std;
// #define ONLINE_JUDGE
const int N = 1e4 + 10, M = N * 2;

int n;
int h[N], e[M], w[M], ne[M], idx;
int ans;

void add(int a, int b, int c)
{
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}

int dfs(int u, int fa)
{
    int dist = 0; // 从当前点向下走的最大长度
    int d1 = 0, d2 = 0; // 最长距离， 次长距离
    for(int i = h[u]; i != -1; i = ne[i])
    {
        int j = e[i];
        if(j == fa) continue;
        int d = dfs(j, u) + w[i];
        dist = max(dist, d);

        if(d >= d1) d2 = d1, d1 = d; // d是最大值
        else if (d > d2) d2 = d; // d是次大值
    }

    ans = max(ans, d1 + d2);
    return dist;
}

int main()
{

    #ifdef ONLINE_JUDGE

    #else
    freopen("./in.txt","r",stdin);
    #endif
    ios::sync_with_stdio(false);
	cin.tie(0);


    cin >> n;

    memset(h, -1, sizeof h);
    for(int i = 0; i < n - 1; i++)
    {
        int a, b, c;
        cin >> a >> b >> c;
        add(a, b, c); add(b, a, c); 
    }

    dfs(1, -1);

    cout << ans << endl;
    return 0;
}